import axios from 'axios'
// import code from './httpCode'
import { Notification } from 'element-ui'

// 通用接口业务成功判定条件
// const DEF_VALIDATOR = (res) => res.ErrorCode === code.success

// 请求超时时间
axios.defaults.timeout = 5000
// const DEF_DELAY = 300

// 请求拦截器
// axios.interceptors.request.use(
//   config => {
//     // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
//     // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
//     const token = store.state.token;
//     token && (config.headers.Authorization = token);
//     return config;
//   },
//   error => {
//     return Promise.error(error);
//   }
// )

// 响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.status === 200) {
      return Promise.resolve(response)
    } else {
      return Promise.reject(response)
    }
  },
  // 服务器状态码不是200的情况
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 404:
          Notification.error({ title: '404', message: '网络请求不存在' })
          break
        // 其他错误，直接抛出错误提示
        default:
          Notification.error({ title: '500', message: error.response.data.msg })
      }
      return Promise.reject(error.response)
    }
  }
)

// function requestUrl (url) {
//   if (process.env.NODE_ENV === 'development') {
//     if (url.startsWith('/api')) {
//       url = url.replace('/api', '/testApi')
//     }
//   }
//   return url
// }

async function send (url, method, body, options, load, token) {
  const opts = { ...options }
  // url = requestUrl(url)
  if (token) {
    body = {
      _id: window.$globalHub.$store.state.user.userInfo.tokenKey,
      ...body
    }
  }
  opts.headers = {
    Accept: 'application/json',
    'Content-Type': 'application/json',
    'Authorization': window.$globalHub.$store.state.user.userInfo.tokenKey || '',
    ...opts.headers
  }
  if (load) {
  }
  // get、delete接口参数params化
  if ((method === 'get' || method === 'delete') && body) {
    opts.params = body
  }
  return axios({ method, url, data: body, ...opts }).then(async res => {
    const obj = res.data
    // let time = load ? delay : 0
    // 验证接口结果
    if (obj) {
      return obj
    } else {
      Notification.error({ title: '错误', message: '未知错误' })
    }
  })
}

export default {
  /**
   * 调用Get接口
   * @param url 接口地址
   * @param body 接口参数
   * @param options axios的options设置（参考https://github.com/mzabriskie/axios）
   * @param load  是否展示loading (true：默认，展示全屏loading框，false：不展示，btn：展示按钮loading)
   * @param loadMsg loading展示文字
   * @param loadID loading按钮标识（用以多个loadingBtn的情况，默认为null）
   * @param validator 业务成功逻辑判断
   * @param delay 接口延迟时间，默认300
   * @param defFail 是否使用默认业务失败处理
   * @param defEx 是否使用默认接口失败处理
   */
  get (url, body, { options = null, load = true, token = false } = {}) {
    return send(url, 'get', body, options, load, token)
  },
  /**
   * 调用Post接口
   * @param url 接口地址
   * @param body 接口参数
   * @param options axios的options设置（参考https://github.com/mzabriskie/axios）
   * @param load  是否展示loading (true：默认，展示全屏loading框，false：不展示，btn：展示按钮loading)
   * @param loadMsg loading展示文字
   * @param loadID loading按钮标识（用以多个loadingBtn的情况，默认为null）
   * @param validator 业务成功逻辑判断
   * @param delay 接口延迟时间，默认300
   * @param defFail 是否使用默认业务失败处理
   * @param defEx 是否使用默认接口失败处理
   */
  post (url, body, { options = null, load = true, token = false } = {}) {
    return send(url, 'post', body, options, load, token)
  },
  all (list) {
    return axios.all(list).then(axios.spread((...args) => { return args }))
  }
}
